/*******************************************************************************
  * 文件：Hardware_IO.c
  * 作者：zyz
  * 版本：v1.0.0
  * 日期：2017-08-03
  * 说明：IO相关
*******************************************************************************/

/* 头文件 *********************************************************************/
#include "Hardware_IO.h"
#include "lib_gpio.h"

/* 宏定义 *********************************************************************/
/* 类型定义 *******************************************************************/
/* 变量定义 *******************************************************************/
/* 函数声明 *******************************************************************/
/* 函数定义 *******************************************************************/

// WIFI模块电源控制
void Hardware_SetWifiPower(Bool bState)
{
    if(bState)
    {
        GPIOA_SetBit(GPIO_Pin_3);
    }
    else
    {
        GPIOA_ResetBit(GPIO_Pin_3);
    }
}

// 1620控制DIN
void Hardware_1620SetDIN(Bool bState)
{
    if(bState)
    {
        GPIOB_SetBit(GPIO_Pin_26);
    }
    else
    {
        GPIOB_ResetBit(GPIO_Pin_26);
    }
}

// 1620控制CLK
void Hardware_1620SetCLK(Bool bState)
{
    if(bState)
    {
        GPIOB_SetBit(GPIO_Pin_27);
    }
    else
    {
        GPIOB_ResetBit(GPIO_Pin_27);
    }
}

// 1620控制STB
void Hardware_1620SetSTB(Bool bState)
{
    if(bState)
    {
        GPIOA_SetBit(GPIO_Pin_13);
    }
    else
    {
        GPIOA_ResetBit(GPIO_Pin_13);
    }
}

/*******************************************************************************
  * 函数名：Hardware_BuzSetFreq
  * 功  能：设置FREQ频率
  * 参  数：U16 u16Freq:频率
  * 返回值：无
  * 说  明：MCU自带BUZ频率最小 = SystemCoreClock/（2*2^20 + 1）,48Mhz主频时，可
   实现的最小频率为23HZ
*******************************************************************************/
void Hardware_BuzSetFreq(U16 u16Freq)
{
    float tmp;
    extern uint32_t SystemCoreClock;
    
    if(u16Freq < 23)
    {
        GPIO->BUZC.BUZEN = 0;
    }
    else
    {
        tmp = SystemCoreClock / (u16Freq * 2) - 1;
        GPIO->BUZC.BUZ_LOAD = (uint32_t)tmp;   
        GPIO->BUZC.BUZEN = 1;        
    }
}

/*******************************************************************************
  * 函数名：Hardware_BuzSetFreq
  * 功  能：设置FREQ频率
  * 参  数：U16 u16Freq:频率
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Hardware_BuzSetDriver(Bool bState)
{
//    if(bState)
//    {
//        GPIO->BUZC.BUZEN = 1;
//    }
//    else
//    {
//        GPIO->BUZC.BUZEN = 0;
//    }
}

/*******************************************************************************
  * 函数名：Hardware_BuzInit
  * 功  能：初始化Buz
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Hardware_BuzInit(void)
{
    GPIO_InitStruType x;
    memset(&x, 0, sizeof(x));

    // 输出功能配置
    x.GPIO_Signal    = GPIO_Pin_Signal_Digital;     // 数字信号引脚
    x.GPIO_Func      = GPIO_Func_3;                 // 复用功能3 - 之前为1是TXD4
    x.GPIO_Direction = GPIO_Dir_Out;                // 输出功能
    x.GPIO_PUEN      = GPIO_PUE_Input_Disable;      // 输入弱上拉禁止
    x.GPIO_PDEN      = GPIO_PDE_Input_Disable;      // 输入弱下拉禁止
    x.GPIO_OD        = GPIO_ODE_Output_Disable;     // 输出开漏禁止
    x.GPIO_DS        = GPIO_DS_Output_Normal;       // 普通电流输出
    x.GPIO_TYP       = GPIO_TYP_TTL;                // TTL端口类型
    x.GPIO_FLT       = GPIO_TYP_FLT_DISABLE;        // 关闭滤波
    
    GPIO_Init(GPIOA, GPIO_Pin_1, &x);               // 蜂鸣器 - PA1
}

void Hardware_BuzzerPowerSet(Bool bPower)
{

}

void Hardware_EnablePWM(Bool bDriver)
{

}

/*******************************************************************************
  * 函数名：Hardware_SetPWM
  * 功  能：对蜂鸣器的频率及占空比设置
  * 参  数：U16 u16Freq: 蜂鸣器频率设置
  *         U8 u8Duty: 占空比暂时不起作用
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Hardware_SetPWM(U16 u16Freq,U8 u8Duty)
{
    if(u16Freq == 0)
    {
        BUZC_Frequence(0, DISABLE);  
    }
    else
    {
        BUZC_Frequence(u16Freq, ENABLE);     
    }
}

// TBD
void Hardware_LED1Ctrl(Bool bState)
{
    if(bState == ON)
    {
        GPIOA_ResetBit(GPIO_Pin_6); 
    }
    else
    {
        GPIOA_SetBit(GPIO_Pin_6);
    }
}

// 桥接LED控制
void Hardware_BridgeLEDCtrl(Bool bState)
{
    if(bState == ON)
    {
        GPIOB_ResetBit(GPIO_Pin_11); 
    }
    else
    {
        GPIOB_SetBit(GPIO_Pin_11);
    }
}

// 右侧继电器控制
void Hardware_RelayRightCtrl(Bool bState)
{
    if(bState == ON)
    {        
        GPIOA_SetBit(GPIO_Pin_0); 
    }
    else
    {
        GPIOA_ResetBit(GPIO_Pin_0);
    }
}

// 左侧继电器控制
void Hardware_RelayLeftCtrl(Bool bState)
{
    if(bState == ON)
    {        
        GPIOB_SetBit(GPIO_Pin_13); 
    }
    else
    {
        GPIOB_ResetBit(GPIO_Pin_13);
    }
}

/*******************************************************************************
  * 函数名：Hardware_InitIO
  * 功  能：初始化IO
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Hardware_InitIO(void)
{
    GPIO_InitStruType x;
    memset(&x, 0, sizeof(x));

    // 输出功能配置
    x.GPIO_Signal    = GPIO_Pin_Signal_Digital;     // 数字信号引脚
    x.GPIO_Func      = GPIO_Func_0;                 // 复用功能0
    x.GPIO_Direction = GPIO_Dir_Out;                // 输出功能
    x.GPIO_PUEN      = GPIO_PUE_Input_Disable;      // 输入弱上拉禁止
    x.GPIO_PDEN      = GPIO_PDE_Input_Disable;      // 输入弱下拉禁止
    x.GPIO_OD        = GPIO_ODE_Output_Disable;     // 输出开漏禁止
    x.GPIO_DS        = GPIO_DS_Output_Normal;       // 普通电流输出
    x.GPIO_TYP       = GPIO_TYP_TTL;                // TTL端口类型
    x.GPIO_FLT       = GPIO_TYP_FLT_DISABLE;        // 关闭滤波
    
    GPIO_Init(GPIOA, GPIO_Pin_6, &x);               // LED1 - 其实对应显示板上的LED2
    GPIO_Init(GPIOB, GPIO_Pin_11, &x);               // LED3
    
    GPIO_Init(GPIOA, GPIO_Pin_0, &x);               // 继电器1(暂时认为是右侧继电器) 
    GPIO_Init(GPIOB, GPIO_Pin_13, &x);              // 继电器2(暂时认为是左侧继电器)

    GPIO_Init(GPIOA, GPIO_Pin_13, &x);              // 1602-STB 
    GPIO_Init(GPIOB, GPIO_Pin_27, &x);              // 1602-CLK
    GPIO_Init(GPIOB, GPIO_Pin_26, &x);              // 1602-DIN
    
    // 蜂鸣器IO初始化
    Hardware_BuzInit();
    
    // 风扇控制引脚初始化
    x.GPIO_Signal   = GPIO_Pin_Signal_Digital;     // 数字信号引脚
    x.GPIO_Func     = GPIO_Func_5;                 // 复用功能5
    x.GPIO_Direction= GPIO_Dir_Out;                // 输出功能
    x.GPIO_PDEN     = GPIO_PDE_Input_Disable;      // 输入弱下拉禁止
    x.GPIO_PUEN     = GPIO_PUE_Input_Disable;      // 输入弱上拉禁止
    x.GPIO_OD       = GPIO_ODE_Output_Disable;     // 输出开漏禁止
    x.GPIO_DS       = GPIO_DS_Output_Normal;       // 普通电流输出

    GPIO_Init(GPIOB, GPIO_Pin_12, &x);             // 风扇控制引脚

    // 不用的IO初始化
//    GPIO_Init(GPIOA, GPIO_Pin_11, &x);
//    GPIO_Init(GPIOA, GPIO_Pin_12, &x);
//    GPIO_Init(GPIOA, GPIO_Pin_22, &x);
//    GPIO_Init(GPIOA, GPIO_Pin_23, &x);
//    GPIO_Init(GPIOA, GPIO_Pin_24, &x);
//    GPIO_Init(GPIOA, GPIO_Pin_25, &x);
//    GPIO_Init(GPIOA, GPIO_Pin_30, &x);
//    GPIO_Init(GPIOA, GPIO_Pin_31, &x);
//    GPIO_Init(GPIOB, GPIO_Pin_3,  &x);
//    GPIO_Init(GPIOB, GPIO_Pin_4,  &x);
//    GPIO_Init(GPIOB, GPIO_Pin_5,  &x);
//    GPIO_Init(GPIOB, GPIO_Pin_6,  &x);
//    GPIO_Init(GPIOB, GPIO_Pin_14, &x);
//    GPIO_Init(GPIOB, GPIO_Pin_15, &x);
//    GPIO_Init(GPIOB, GPIO_Pin_18, &x);
//    GPIO_Init(GPIOB, GPIO_Pin_19, &x);
//    GPIO_Init(GPIOB, GPIO_Pin_21, &x);
//    GPIO_Init(GPIOB, GPIO_Pin_22, &x);
//    GPIO_Init(GPIOB, GPIO_Pin_28, &x);
//    GPIO_Init(GPIOB, GPIO_Pin_29, &x);
//    GPIO_Init(GPIOB, GPIO_Pin_30, &x);
//    GPIO_Init(GPIOB, GPIO_Pin_31, &x);

    Hardware_BridgeLEDCtrl(OFF);
    Hardware_LED1Ctrl(OFF);
}



/***************************** 文件结束 ***************************************/
